von Frank Gerberding |
Es gibt im wesentlichen zwei Hauptprobleme bei 3-D-Grafik: Sie ist erstens teilweise �u�erst kompliziert und damit f�r die meisten Menschen normalerweise unzug�nglich und zweitens sind die auf dem Markt befindlichen Spezialchips zur Beschleunigung des Bildaufbaus so unterschiedlich, da� man f�r jede Grafikkarte und f�r jeden Computer eigentlich ein eigenes ganz spezielles Programm schreiben m��te. Diese beiden Nachteile lassen sich aber sehr einfach umgehen: man benutzt eine standardisierte Computergrafik-Bibliothek, die dem Benutzer die ganze Mathematik und Hardware abnimmt.
Inzwischen gibt es eine ganze Reihe solcher Standards, die jedoch um den Amiga bisher immer einen gro�en Bogen gemacht haben. Gl�cklicherweise ist nun einer dieser Standards (zumindest teilweise) auf unseren Lieblingscomputer �bertragen worden: �CyberGL�.
Ein weiterer Standard ist �PHIGS�
(Programmers Hierarchical Interactive Graphics
System), der sogar als ANSI- und ISO-Norm
vorliegt. Allerdings ist auch schon PHIGS (bzw.
PHIGS+), das aus dem steinalten GKS (Graphical
Kernel System) hervorgegangen ist, in die Jahre
gekommen und ist auf heutigen Systemen wenig zu
finden.
Der Standard �Heidi� wird fast
ausschlie�lich auf PCs vom Programm
�3D-Studio-Maxx� verwendet. Bibliothek und
Programm stammen beide von AutoDesk und wegen der
zwingenden Verwendung von Microsofts Visual C++
f�r alle anderen Rechner v�llig uninteressant.
Der verbreitetste und wohl bekannteste Standard
ist �OpenGL� (Open Graphics Library), die
besonders durch die Verwendung auf aufgemotzten
Computern der Firma �Silicon Graphics� (SGI)
ihren Siegeszug angetreten hat. Obwohl die OpenGL
nicht der m�chtigste der hier vorgestellten
Standards ist, hat sie gerade durch ihre
explizite Rechnerunabh�ngigkeit den Weg auf viele
Plattformen (u.a. UNIX, Win95/NT, OS/2) gefunden.
Durch CyberGL wird OpenGL nun auch in den Amiga
implementiert.
Wenden wir uns daher den Eigenschaften der OpenGL zu, die f�r jede OpenGL-Version identisch sind. Da die Bibliothek m�glichst universell einsetzbar sein soll, werden keine Objekte verwaltet, die �in einem Rutsch� gezeichnet werden, sondern es werden grunds�tzlich immer alle Punkte, Linien, Polygone (in der OpenGL hei�en sie �Primitive�) usw. sofort gezeichnet, nachdem man sie der OpenGL bekannt gemacht hat und gleich anschlie�end �vergi�t� sie sie wieder. Die Applikation ist also f�r die Primitive-Verwaltung verantwortlich. Daf�r gibt es aber eine Flut von Einstellungen, die die Art der Darstellung von Primitiven beeinflussen. Diese Einstellungen lassen sich (fast) jederzeit �ndern und wirken sich auf alle nachfolgenden Zeichenoperationen aus. Die aktuellen Einstellungen bilden zusammen einen sogenannten Kontext � der Benutzer kann beliebig viele erzeugen und zwischen ihnen umschalten. Da der aktuelle Kontext eine Art Statusinformation darstellt, spricht man bei der OpenGL auch von einer �State Machine� � im Gegensatz zu objektorientierten Bibliotheken wie z.B. Quickdraw 3D, bei denen die 3-D-Objekte ihre Eigenschaften mit sich f�hren.
Zu Beginn wollen wir uns jedoch auf Dreiecke beschr�nken, um den Mechanismus zu erkl�ren. Im n�chsten Kursteil wollen wir dann noch einmal genauer auf die anderen Objekte eingehen. Die OpenGL wird zur Beschreibung von Primitiven durch den Aufruf der Funktion �glBegin� in einen speziellen Zustand versetzt, in dem nur eine sehr eingeschr�nkte Anzahl der Funktionen zul�ssig ist, um die Eckpunkte von Primitiven und deren Eigenschaften (Farbe, Texturkoordinaten, Normale usw.) zu spezifizieren. Sind alle gew�nschten Primitive beschrieben, wird der Zustand durch �glEnd� wieder verlassen und es sind wieder alle Funktionen zul�ssig. Die Funktion zur Angabe der Eckpunkte hei�t �glVertex� � es gibt sie in insgesamt 24 Versionen, die die verschiedenen Datentypen von �unsigned byte� bis �double� unterst�tzen.
Ein sehr einfaches Beispiel zum
Zeichnen von zwei Dreiecken finden Sie in unserem Listing.
Die Funktion �glBegin� wird
mit dem Parameter �GL_TRIANGLES� aufgerufen, um
bekanntzugeben, da� nun Dreiecke folgen. Die
Funktion �glVertex2d� erwartet je eine X- und
eine Y-Koordinate (zwei Werte, daher die �2�) als
�double�-Wert (daher das �d�).
Der
Koordinatenbereich ist von der Einstellung der
Transformationen abh�ngig und soll hier im
Bereich (-1.0,-1.0) f�r die untere linke
Fensterecke und (1.0,1.0) f�r die obere rechte
Fensterecke liegen. Derselbe Mechanismus wird f�r
alle anderen Primitive angewendet, doch dazu mehr
im n�chsten Teil. Wir wollen uns zuerst noch der
Tortur zuwenden, die die Vertices nach ihrer
Spezifikation durchlaufen.
Mit Fragment bezeichnet man in der OpenGL Pixel mit zugeh�renden Informationen (Farbe, Entfernung vom Betrachter, Texturkoordinaten usw.). Diese Fragmente durchlaufen nun ihrerseits eine Reihe von Stufen � dazu geh�rt Z-Buffer-Test und das Dithering. Am Ende der ganzen Prozedur fallen eine Menge Pixel heraus, die schlie�lich gezeichnet werden. Wie man sieht, ist trotz der Verwendung der Bibliothek immer noch eine Menge Wissen �ber dreidimensionale Grafik n�tig. Aber es ist alles halb so wild wie es zun�chst erscheint, da OpenGL viele Funktionen zur Verf�gung stellt, um komfortabel die n�tigen Einstellungen vorzunehmen. Doch dazu mehr in der n�chsten Folge, in dem die CyberGL endlich zum Einsatz kommt.
lb |
Literatur:
[1] Analytische Geometrie und Lineare Algebra, Cornelsen Verlag, ISBN: 3-590-12319-2
[2] OpenGL Programming Guide, Addison Wesley Publishing Company, ISBN 0-201-63274-8
Kurs�bersicht
Folge 1: Grundlagen zur 3-D-Grafik. Welche Standards existieren? Was ist die OpenGL und wie arbeitet die Bibliothek.
Folge 2: Besonderheiten der CyberGL, Anwendung von CyberGL, erste Beispiele.
Folge 3: Tiefere Einblicke in die CyberGL-M�glichkeiten (Nebel, Texturemapping usw.). Anwendung von CyberGL in einem Fraktalgebirge-Programm.
Normale: Ein Vektor (bestehend aus X-, Y- und Z-Koordinate), der senkrecht auf einer (gedachten) Fl�che steht und so die Oberfl�chenrichtung der Fl�che angibt. Ein Normalenvektor hat immer die L�nge 1.
Grafik-Pipeline: Bei der Darstellung eines Polygons durchl�uft dies eine Reihe Bearbeitungsstufen. Dazu geh�ren Transformationen, Beleuchtung, Clipping, Rasterung und die Pixeloperationen (z.B. Dithering). Diese Stufen werden zusammen als Pipeline bezeichnet und durch die Hardware parallel ausgef�hrt werden.
Clipping: Fl�chen und Linien sind immer komplett sichtbar, komplett au�erhalb des Fensters oder sie schneiden den Fensterrand. Das Abschneiden von Objekten an den Fensterr�ndern nennt man Clipping.
Dithering: Oft steht nur eine begrenzte Anzahl Farben zur Verf�gung (z.B. 256), die bei weitem nicht ausreichen, um sanfte Farbverl�ufe oder bunte Texturen wiederzugeben. Daher setzt man abwechselnd Pixel mit �hnlicher Farbe nebeneinander, um eine Zwischenfarbe vorzut�uschen. Diesen Trick bezeichnet man als Dithering.
Wireframe: Drahtgitterdarstellung eines Objekts. Es werden nur die Kanten der Objektpolygone gezeichnet. Dies ist die schnellste und einfachste Art der Darstellung, da die Software keine verdeckten Kanten entfernen mu� und das Zeichnen von Linien sehr schnell geht. (s. Bild �Wireframe�)
Flatshading: Bei dieser Art der Objektdarstellung werden alle Fl�chen in ihren Fl�chenschwerpunkten beleuchtet und anschlie�end komplett in dieser Farbe gezeichnet. Da das F�llen von Fl�chen mit einer einzigen Farbe sehr einfach ist, z�hlt auch diese Art der Darstellung zu den schnelleren Varianten. Die so gezeichneten Objekte wirken jedoch sehr kantig (s. Bild �Flatshading�).
Gouraudshading: Beleuchtet man eine Fl�che an allen Eckpunkten einzeln, so kann man ein Objekt runder erscheinen lassen. Dazu werden die Fl�cheneckpunkte in der berechneten Farbe gezeichnet und alle Bildpunkte dazwischen erhalten eine �Zwischenfarbe�. Die Silhouette eines K�rpers bleibt aber auch mit diesem Trick kantig. (s. Bild �Gouraudshading�)
Antialiasing: Da jedes Pixel auf dem Bildschirm nur eine festgelegte Farbe haben kann und eine Linie oder ein Polygon fast nie exakt an den Pixelr�ndern aufh�rt, bilden sich die ber�chtigten Treppchenmuster. Mit Antialiasing r�ckt man diesem Ph�nomen zu Leibe, indem man angrenzenden Pixeln eine ��hnliche� Farbe gibt und so die harten Kontraste vertuscht. (s. Bild �Antialiasing�)
Texturemapping: Wenn ein Objekt besonders realistisch aussehen soll, mu� man sehr viele Details modellieren. Da dies jedoch sehr viel Speicher und Rechenzeit ben�tigt, kann man auch so tun als seien Details vorhanden, indem man Textur (ein Bild) auf das Objekt �klebt�. (s. Bild �Texturemapping�)
Perspektiv-Korrektur: Ohne dieses Verfahren wirken Texturen teilweise sehr verzerrt (bekannt von Spielen). Eine echte Perspektivkorrektur erfordert jedoch eine hohe Rechenleistung (zwei Divisionen pro Bildpunkt zus�tzlich).
Z-Buffer: Es gibt sehr viele verschiedene Verfahren, verdeckte Objekte aus einer Szene auszublenden. Ein sehr einfaches und besonders vielseitiges ist das Z-Buffering. Dabei merkt man sich zu jedem Pixel nicht nur dessen Farbe, sondern auch seine Entfernung vom Betrachter (seine Z-Koordinate). Soll nun ein Pixel gezeichnet werden, sieht man zun�chst nach, ob das neue Pixel n�her am Betrachter ist als das alte Pixel an der gleichen Stelle und merkt sich die neue Entfernung gegebenenfalls. Ist es weiter entfernt, passiert �berhaupt nichts, da das neue Pixel vom alten verdeckt wird. Da man sich aber f�r jedes Pixel mindestens eine 16-Bit-Zahl merken mu�, nagt das Verfahren sp�rbar am Speicher. Beispiel: 640 x 480 Pixel mit je zwei Byte Z-Buffer-Information ergibt 614400 Bytes.
Texturfilter: Wird eine Textur auf ein Polygon �geklebt�, so tritt f�r jeden Bildpunkt einer von zwei F�llen auf: es werden mehrere Texturpixel auf einen Bildpunkt oder ein Texturpixel wird auf mehrere benachbarte Bildpunkte abgebildet. Dadurch entstehen entweder Abtastfehler (Verkleinerung der Textur) oder Pixelbl�cke (Vergr��erung der Textur). Durch Texturfilter kann man diesen Effekten entgegenwirken.
Bilineare Filter: Dieser Texturfilter gl�ttet die Texturpixel durch Zwischenwerte (bilineare Interpolation). Er kommt bei nahe am Betrachter liegenden Bildpunkten zum Einsatz und l��t die Textur mit abnehmender Entfernung unsch�rfer wirken.
MIPmapping: Multum In Parvo (lat.: vieles in einem). Die Textur wird in vielen Gr��en bis hin zur Gr��e 1 mal 1 Pixel vorgefiltert abgelegt. Das Texturemapping w�hlt nun f�r jedes Pixel die passende vorgefilterte Textur aus. Dieser Filter kommt bei weit entfernten Bildpunkten zum Einsatz und l��t die Textur mit zunemhmender Entfernung weniger detailliert erscheinen.
� Copyright by MagnaMedia Verlag AG, Haar bei M�nchen
Ver�ffentlichung und Vervielf�ltigung nur mit schriftlicher Genehmigung des Verlags